package com.yupi.springbootinit.manager;

import com.yupi.springbootinit.common.ErrorCode;
import com.yupi.springbootinit.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/*
 * 限流基础服务
 * */
@Service
public class RedisLimiterMananger {
    @Resource
    private RedissonClient redissonClient;


    /**
     * 限流
     *
     * @param key 来区分不同限流器
     */
    public void doRateLimit(String key){
        // 根据 key 创建一个限流器
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);

        // 限流器规则每秒 2 个请求，连续请求最多只有 1 个请求通过
        // RateType.OVERALL 该速率限制作用所有令牌桶
        rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);

        boolean canOp = rateLimiter.tryAcquire(1);
        if(!canOp){
            throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
        }
    }
}
